#!/usr/bin/env python3
"""
Paps MCP Server

面向 paps 软件的 MCP Server，提供将文本文件转换为 PostScript 格式的命令行工具封装。

MCP tools 列表：
1. paps_help - 显示 paps 命令的帮助信息
   参数：无
   返回：包含帮助信息的统一 JSON 结构

2. paps_convert_text - 将文本文件转换为 PostScript 格式
   参数：
     - input_file: 输入文本文件路径
     - landscape: 是否使用横向模式 (bool, 可选)
     - stretch_chars: 是否拉伸字符 (bool, 可选)
     - markup: 是否启用标记 (bool, 可选)
     - columns: 列数 (int, 可选)
     - font: 字体名称 (str, 可选)
     - rtl: 是否从右到左 (bool, 可选)
     - paper: 纸张类型 (str, 可选)
     - bottom_margin: 底部边距 (int, 可选)
     - top_margin: 顶部边距 (int, 可选)
     - right_margin: 右边距 (int, 可选)
     - left_margin: 左边距 (int, 可选)
     - header: 是否显示页眉 (bool, 可选)
     - encoding: 编码格式 (str, 可选)
     - lpi: 每英寸行数 (int, 可选)
     - cpi: 每英寸字符数 (int, 可选)
   返回：包含转换结果的统一 JSON 结构
"""

import subprocess
import json
from typing import Optional, List
from mcp.server.fastmcp import FastMCP, Context

mcp = FastMCP("Paps MCP Server")

@mcp.tool()
def paps_help() -> dict:
    """
    显示 paps 命令的帮助信息
    
    返回:
        dict: 统一 JSON 结构，包含帮助信息
    """
    try:
        result = subprocess.run(
            ["paps", "-h"],
            capture_output=True,
            text=True,
            timeout=30
        )
        
        return {
            "success": result.returncode == 0,
            "command": "paps -h",
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": "paps -h",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def paps_convert_text(
    input_file: str,
    landscape: Optional[bool] = None,
    stretch_chars: Optional[bool] = None,
    markup: Optional[bool] = None,
    columns: Optional[int] = None,
    font: Optional[str] = None,
    rtl: Optional[bool] = None,
    paper: Optional[str] = None,
    bottom_margin: Optional[int] = None,
    top_margin: Optional[int] = None,
    right_margin: Optional[int] = None,
    left_margin: Optional[int] = None,
    header: Optional[bool] = None,
    encoding: Optional[str] = None,
    lpi: Optional[int] = None,
    cpi: Optional[int] = None
) -> dict:
    """
    将文本文件转换为 PostScript 格式
    
    参数:
        input_file: 输入文本文件路径
        landscape: 是否使用横向模式
        stretch_chars: 是否拉伸字符
        markup: 是否启用标记
        columns: 列数
        font: 字体名称
        rtl: 是否从右到左
        paper: 纸张类型
        bottom_margin: 底部边距
        top_margin: 顶部边距
        right_margin: 右边距
        left_margin: 左边距
        header: 是否显示页眉
        encoding: 编码格式
        lpi: 每英寸行数
        cpi: 每英寸字符数
    
    返回:
        dict: 统一 JSON 结构，包含转换结果
    """
    try:
        cmd = ["paps"]
        
        # 添加可选参数
        if landscape:
            cmd.append("--landscape")
        if stretch_chars:
            cmd.append("--stretch-chars")
        if markup:
            cmd.append("--markup")
        if columns is not None:
            cmd.append(f"--columns={columns}")
        if font:
            cmd.append(f"--font={font}")
        if rtl:
            cmd.append("--rtl")
        if paper:
            cmd.append(f"--paper={paper}")
        if bottom_margin is not None:
            cmd.append(f"--bottom-margin={bottom_margin}")
        if top_margin is not None:
            cmd.append(f"--top-margin={top_margin}")
        if right_margin is not None:
            cmd.append(f"--right-margin={right_margin}")
        if left_margin is not None:
            cmd.append(f"--left-margin={left_margin}")
        if header:
            cmd.append("--header")
        if encoding:
            cmd.append(f"--encoding={encoding}")
        if lpi is not None:
            cmd.append(f"--lpi={lpi}")
        if cpi is not None:
            cmd.append(f"--cpi={cpi}")
        
        # 添加输入文件
        cmd.append(input_file)
        
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            timeout=30
        )
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(cmd),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": "paps with various options",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()